package role

import (
	"errors"
	domain "furniture-server-gin/api/pkg/domain/role"
)

var (
	ErrRoleNotFound = errors.New("role not found")
)

// Service 角色应用服务
type Service struct {
	repo domain.Repository
}

// NewService 创建角色服务
func NewService(repo domain.Repository) *Service {
	return &Service{
		repo: repo,
	}
}

// CreateRole 创建角色
func (s *Service) CreateRole(name, description string) error {
	// 检查角色是否已存在
	if _, err := s.repo.FindByName(name); err == nil {
		return errors.New("role already exists")
	}

	// 创建角色
	role := domain.NewRole(name, description)
	return s.repo.Create(role)
}

// GetRoleByID 根据ID获取角色
func (s *Service) GetRoleByID(id string) (*domain.Role, error) {
	return s.repo.FindByID(id)
}

// GetRoleByName 根据名称获取角色
func (s *Service) GetRoleByName(name string) (*domain.Role, error) {
	return s.repo.FindByName(name)
}

// GetAllRoles 获取所有角色
func (s *Service) GetAllRoles() ([]*domain.Role, error) {
	return s.repo.FindAll()
}

// UpdateRole 更新角色
func (s *Service) UpdateRole(id, name, description string) error {
	role, err := s.repo.FindByID(id)
	if err != nil {
		return ErrRoleNotFound
	}

	role.Update(name, description)
	return s.repo.Update(role)
}

// DeleteRole 删除角色
func (s *Service) DeleteRole(id string) error {
	return s.repo.Delete(id)
}
